home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue67 / Threads / HiddenWordThread.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  2000-12-29  |  2.8 KB  |  122 lines

  1. unit HiddenWordThread;
  2.  
  3. interface
  4.  
  5. uses SysUtils,Classes,syncobjs,Windows,Messages,Dialogs,
  6.  //My Units
  7.  BasicThread;
  8.  
  9. type
  10.  THiddenWordThread=class(TBasicThread)
  11.  private
  12.   fHiddenWord:string;
  13.   fSenderThreadID:THandle;
  14.   procedure ExecuteLoop;
  15.   procedure PeekMessage;
  16.   procedure RequestWordLength;
  17.   procedure LetterUsedAtPosition(const lp:LPARAM);
  18.  protected
  19.   procedure Execute;override;
  20.  public
  21.   constructor Create(CreateSuspended: Boolean; const HiddenWord: string);
  22.   destructor Destroy;override;
  23.  end;
  24.  
  25. implementation
  26.  
  27. constructor THiddenWordThread.Create
  28.  (CreateSuspended: Boolean
  29.  ;const HiddenWord:string);
  30. begin
  31.  fHiddenWord:=HiddenWord;
  32.  inherited Create(CreateSuspended);
  33. end;
  34.  
  35. destructor THiddenWordThread.Destroy;
  36. begin
  37.   inherited Destroy;
  38. end;
  39.  
  40. procedure THiddenWordThread.Execute;
  41. var
  42.  Msg:TMsg;
  43. begin
  44.  try
  45.   //Force a message queue for the thread to be created.
  46.   Windows.PeekMessage(Msg,0,0,0,PM_NOREMOVE);
  47.   ExecuteLoop;
  48.  except
  49.   fException:=ExceptObject As Exception;
  50.   Synchronize(ShowException);
  51.  end;
  52. end;
  53.  
  54. procedure THiddenWordThread.ExecuteLoop;
  55. begin
  56.  while not Terminated do
  57.  begin
  58.   try
  59.    Windows.WaitMessage;
  60.    //Note could use GetMessage but this wouldn't allow the WM_Quit to jump its
  61.    //position in the queue.
  62.    if PeekQuitMessage then
  63.     exit;
  64.    PeekMessage;
  65.   except
  66.    //Don't reraise the exception cos we require the loop to keep executing.
  67.    on E:Exception do
  68.     begin
  69.      {Log Exception to Event Log}
  70.     end;
  71.   end;
  72.  end;
  73. end;
  74.  
  75. procedure THiddenWordThread.PeekMessage;
  76. var
  77.  Msg:TMsg;
  78. begin
  79.  while(Windows.PeekMessage(Msg,0,0,0,PM_Remove))do
  80.  begin
  81.   fSenderThreadID:=Msg.wParam;//Doesn't apply to WM_QUIT message
  82.   case Msg.message of
  83.    WM_QUIT:Terminate;
  84.    WM_Signal_RequestWordLength:RequestWordLength;
  85.    WM_Signal_RequestLetterUsedAtPosition:LetterUsedAtPosition(Msg.lParam);
  86.    else
  87.     begin
  88.      exit;
  89.      //Translates virtual-key messages into character messages
  90.      //Not really required since the thread does not process any keyboard characters!!!
  91.      TranslateMessage(Msg);
  92.      //Dispatches message to a window procedure with the window handle specified in the MSG structure
  93.      //Note again the window handle will be null and no action taken.
  94.      DispatchMessage(Msg);
  95.     end;
  96.   end;
  97.  end;
  98. end;
  99.  
  100. procedure THiddenWordThread.RequestWordLength;
  101. begin
  102.  PostThreadMessage(fSenderThreadID,WM_Signal_WordLengthIs,0,Length(fHiddenWord));
  103. end;
  104.  
  105. procedure THiddenWordThread.LetterUsedAtPosition(const lp:LPARAM);
  106. var
  107.  iLetter:integer;
  108.  Position:integer;
  109.  s:string;
  110. begin
  111.  Position:=lp and 31;
  112.  iLetter:=lp shr 5;
  113.  s:=Char(iLetter);
  114.  if CompareText(fHiddenWord[Position],s)=0then
  115.    PostThreadMessage(fSenderThreadID,WM_Signal_Yes,0,0)
  116.  else
  117.   PostThreadMessage(fSenderThreadID,WM_Signal_No,0,0);
  118. end;
  119.  
  120.  
  121. end.
  122.